package com.example.activiti6_demo.demo2;

import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

import java.util.HashMap;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertNotNull;

/**
 * 根据业务信息获取流程实例
 */
@SpringBootTest
public class F_ProcessInstance {

    /**
     * 仓储服务，用于管理流程仓库，例如：部署，删除，读取流程资源
     * 可以用来部署我们的流程图，还可以创建我们的流程部署查询对象，用于查询刚刚部署的流程列表，便于我们管理流程
     */
    @Resource
    private RepositoryService repositoryService;

    /**
     * 运行时服务，可以处理所有正在运行状态的流程实例，任务等
     * 主要用来开启流程实例，一个流程实例对应多个任务，也就是多个流程节点
     */
    @Resource
    private RuntimeService runtimeService;

    /**
     * 方式一：根据流程变量查流程实例，不一定准确
     * 变量应带有业务变量，能够确定唯一性，比如userId
     */
    @Test
    public void getProcessInstanceByVar() throws Exception{
        //流程定义的key
        String processDefinitionKey = "leaveflow";
        //定义变量
        Map<String, Object> varMap = new HashMap<>();
        varMap.put("userId", "123456");
        //根据流程定义act_re_deployment表key启动最新版本的流程
        runtimeService.startProcessInstanceByKey(processDefinitionKey, varMap);

        //根据流程变量查流程实例
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
                .variableValueEquals("userId", "123456")
                .singleResult();
        System.out.println("processInstance: "+processInstance);
    }

    /**
     * 方式二：通过act_ru_execution表的BUSINESS_KEY（业务主键）字段查询流程实例
     * 要先在 BUSINESS_KEY 存放业务的唯一主键
     */
    @Test
    public void exclusiveGateway2() throws Exception{
        //流程定义的key
        String processDefinitionKey = "leaveflow";

        //业务的唯一主键如：userId
        String businessKey = "996";
        //根据流程定义act_re_deployment表key启动最新版本的流程
        runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey);

        //根据流程变量查流程实例
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
                .processInstanceBusinessKey(businessKey)
                .singleResult();
        System.out.println("processInstance: "+processInstance);
    }
}
